# -*- codeing = utf-8 -*-
# @Time : 2021/2/28 11:54
# @Atuthor: 朱朱
# @File: 155迭代器生成FIBONACCI.py
# @Software: PyCharm
""
"""
我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。
如果每次返回的数据值不是在一个已有的数据集合中读取的，
而是通过程序按照一定的规律计算生成的，那么也就意味着可以不用再依赖一个已有的数据集合，
也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取，
这样可以节省大量的存储（内存）空间。

举个例子，比如，数学中有个著名的斐波拉契数列(Fibonacci)，
数列中第一个数为0，第二个数为1，其后的每一个数都可由前两个数相加得到：
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。
那么这个斐波那契数列我们就可以用迭代器来实现，
每次迭代都通过数学计算来生成下一个数。
"""
class Fibonacci(object):
    def __init__(self, n):
        """

        :param n: 指明生成序列的前n个数
        """
        self.n = n
        self.current = 0 # 保存当前数
        self.num1 = 1   # 当前数的,前前一个数
        self.num2 = 1   # 当前数的,前一个数

    def __iter__(self):
        return self

    def __next__(self):
        """被next()函数调用,来获取下一个数"""
        if self.current < self.n:
            num = self.num1
            self.num1,self.num2 = self.num2,self.num1+self.num2
            self.current+=1
            return num
        else:
            raise StopIteration

f = Fibonacci(10)
for i in f:
    print(i)